package br.com.logistica.database;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.apache.log4j.Logger;

import br.com.logistica.base.BaseDAO;
import br.com.logistica.base.BaseException;
import br.com.logistica.databaseinterface.IGenericDAO;
import br.com.logistica.util.dto.ServiceDTO;
import br.com.logistica.vo.Cliente;
import br.com.logistica.vo.Produto;
import br.com.util.QueryUtil;

/**
 * 
 * Esta classe � respons�vel pelas opera��es na base de dados para entidade
 * Produto.Todos os m�todos desta classe retornam um dto,devido ao fato do
 * projeto utilizar este padr�o para comunica��o entre as classes.
 * 
 * @author Eduardo.
 * 
 */
public class ProdutoDAO extends BaseDAO implements Serializable, IGenericDAO {
	private static Logger logger = Logger.getLogger(ProdutoDAO.class);

	@Override
	public ServiceDTO retrieve() throws BaseException {
		try {
			entityManager = FactoryJPA.getInstance(baseEnum);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		ServiceDTO responseDTO = new ServiceDTO();
		String query = "from  Produto tr";
		try {

			List<Produto> list = new ArrayList<Produto>();
			List<br.com.logistica.persistence.entidades.Produto> produtos = entityManager.createQuery(query).getResultList();

			for (br.com.logistica.persistence.entidades.Produto produto : produtos) {
				list.add(castPersistenciaProdutoParaProdutoVO(produto));
			}

			responseDTO.set("produto", list);

		} catch (Exception exception) {
			logger.error(exception);
		}
		return responseDTO;
	}

	private Produto castPersistenciaProdutoParaProdutoVO(
			br.com.logistica.persistence.entidades.Produto produto) {
		Produto produto2 = new Produto();

		produto2.setCfop(produto.getCfop());
		produto2.setCodProdutos(produto.getCodProdutos());
		produto2.setDescricao(produto.getDescricao());
		produto2.setNotasFiscais(null);
		produto2.setIdProduto(produto.getIdProduto());
		produto2.setUnCom(produto.getUncom());
		produto2.setValorUnitario(produto.getValorUnitario());
		return produto2;

	}

	private br.com.logistica.persistence.entidades.Produto castProdutoVOParaPersistenciaProduto(
			Produto produto) {
		br.com.logistica.persistence.entidades.Produto produto2 = new br.com.logistica.persistence.entidades.Produto();
		produto2.setCfop(produto.getCfop());
		produto2.setCodProdutos(produto.getCodProdutos());
		produto2.setDescricao(produto.getDescricao());
		// produto2.setNotasFiscais(null);
		produto2.setIdProduto(produto.getIdProduto());
		produto2.setUncom(produto.getUnCom());
		produto2.setValorUnitario(produto.getValorUnitario());
		return produto2;

	}

	@Override
	public ServiceDTO retrieve(ServiceDTO serviceDTO) throws BaseException {
		try {
			entityManager = FactoryJPA.getInstance(baseEnum);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		ServiceDTO responseDTO = new ServiceDTO();
		Produto produto = (Produto) serviceDTO.get("produto");
		try {
			produto = entityManager.find(Produto.class, produto.getIdProduto());
			responseDTO.set("produto", produto);

		} catch (Exception s) {
			logger.error(s);

		}
		return responseDTO;
	}

	@Override
	public ServiceDTO restrictedRetrieve(ServiceDTO serviceDTO)
			throws BaseException {
		ServiceDTO result = new ServiceDTO();

		HashMap<String, Object> hashMap = (HashMap<String, Object>) serviceDTO.get("pesquisaRestritiva");

		result.set("pesquisaRestritiva",
				QueryUtil.fazerConsultaDinamica(hashMap, Produto.class));
		return result;
	}

	@Override
	public ServiceDTO create(ServiceDTO serviceDTO) throws BaseException {
		ServiceDTO dto = new ServiceDTO();
		begin();
		try {

			Produto produto = (Produto) serviceDTO.get("produto");
			entityManager.persist(entityManager
					.merge(castProdutoVOParaPersistenciaProduto(produto)));
			commit();

		} catch (Exception s) {
			logger.error(s);
			rollback();
		}
		return dto;
	}

	@Override
	public ServiceDTO update(ServiceDTO serviceDTO) throws BaseException {
		ServiceDTO responseDTO = new ServiceDTO();
		begin();
		try {
			Produto produto = (Produto) serviceDTO.get("produto");
			entityManager.merge(produto);
			commit();

		} catch (Exception s) {
			rollback();
			logger.error(s);
		}
		return responseDTO;
	}

	@Override
	public ServiceDTO delete(ServiceDTO serviceDTO) throws BaseException {
		ServiceDTO dto = new ServiceDTO();

		begin();

		try {
			Produto produto = (Produto) serviceDTO.get("produto");
			entityManager.remove(entityManager.merge(produto));

			commit();
		} catch (Exception s) {
			logger.error(s);
			rollback();
		}
		return dto;
	}

}
